﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Cotizav.CONEXION;
using System.Windows.Forms;
using System.Transactions;
using Cotizav.CONTROLADOR;
using System.Data;
using System.Data.Linq;

namespace Cotizav
{
    public class CtrlCartaCompromiso
    {
        private ConexionDataContext conexion;
        private CtrlCartaCompromisoDetalle ctCartaCompromisoDetalle;
        private CtrlPeriodo ctPeriodo;

        public CtrlCartaCompromiso()
        {
            ctCartaCompromisoDetalle = new CtrlCartaCompromisoDetalle();
            ctPeriodo = new CtrlPeriodo();
        }

        internal List<CARTA_COMPROMISO> getListCartaCompromiso()
        {
            using (conexion = new ConexionDataContext())
            {
                DataLoadOptions dlo = new DataLoadOptions();
                dlo.LoadWith<CARTA_COMPROMISO>(x => x.CLIENTE);
                dlo.LoadWith<CARTA_COMPROMISO>(x => x.SUCURSAL);
                conexion.LoadOptions = dlo;

                return conexion.CARTA_COMPROMISO.ToList();
            }
        }

        internal CARTACOMPROMISO_DETALLE getListCartaCompromisoDetalle()
        {
            throw new System.NotImplementedException();
        }

        internal string registrarCartaCompromiso(CARTA_COMPROMISO cartaCompromiso, List<CARTACOMPROMISO_DETALLE> listaEquiposCartaCompromiso)
        {
            using (TransactionScope transactionscope = new TransactionScope())
            {
                string numeroCartaCompromiso = string.Empty;

                using (conexion = new ConexionDataContext())
                {
                    try
                    {
                        int correlativoCartaCompromiso = conexion.COTIZAV_CORRELATIVO.Single(x => x.IDENTIFICADOR == "COTIZAV").CARTA_COMPROMISO.Value;
                        string num = Convert.ToString(correlativoCartaCompromiso);
                        string numero = num.Trim().PadLeft(11, '0');
                        string idCartaCompromiso = "CCO_" + numero;

                        numeroCartaCompromiso = this.generaCodigoCartaCompromiso();

                        cartaCompromiso.idCartaCompromiso = idCartaCompromiso;
                        cartaCompromiso.numeroCarta = numeroCartaCompromiso;
                        cartaCompromiso.fechaCartaCompromiso = DateTime.Now;

                        conexion.CARTA_COMPROMISO.InsertOnSubmit(cartaCompromiso);
                        conexion.SubmitChanges();
                        conexion.increm_ContCartaCompromiso();
                        conexion.increm_NumCartaCompromisoActivo();
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }

                using (conexion = new ConexionDataContext())
                {
                    try
                    {
                        int i = 1;
                        foreach (CARTACOMPROMISO_DETALLE cartaDetalle in listaEquiposCartaCompromiso)
                        {
                            ctCartaCompromisoDetalle.registrarCartaCompromisoDetalle(cartaDetalle, cartaCompromiso, i);
                            i++;
                        }

                        transactionscope.Complete();
                        return numeroCartaCompromiso;
                    }
                    catch (Exception)
                    {
                        throw;
                    }
                }
            }
        }

        private string generaCodigoCartaCompromiso()
        {
            string result = string.Empty;

            PERIODO periodo = ctPeriodo.getPeriodoActual();
            int numeroCartaCompromiso = periodo.numeroCartaCompromiso.Value;
            result = Convert.ToString(periodo.mesPeriodo).PadLeft(2, '0') + "-" + Convert.ToString(numeroCartaCompromiso).PadLeft(4,'0');

            return result;
        }

        internal CARTA_COMPROMISO getCartaCompromiso(string idCartaCompromiso)
        {
            using (conexion = new ConexionDataContext())
            {
                try
                {
                    return conexion.CARTA_COMPROMISO.SingleOrDefault(x => x.idCartaCompromiso == idCartaCompromiso);
                }
                catch (Exception)
                {
                    throw;
                }
            }
        }

        internal System.Data.DataTable getListCartaCompromisoSP(string idCartaCompromiso)
        {
            DataTable result = new DataTable();

            using (conexion = new ConexionDataContext())
            {
                var query = conexion.usp_listarCartaCompromiso(idCartaCompromiso);

                result.Columns.Add("idCartaCompromiso", Type.GetType("System.String"));
                result.Columns.Add("idVendedor", Type.GetType("System.String"));
                result.Columns.Add("idCargo", Type.GetType("System.String"));
                result.Columns.Add("numeroCarta", Type.GetType("System.String"));
                result.Columns.Add("fechaCartaCompromiso", Type.GetType("System.String"));
                result.Columns.Add("nombrecliente", Type.GetType("System.String"));
                result.Columns.Add("referencia1", Type.GetType("System.String"));
                result.Columns.Add("referencia2", Type.GetType("System.String"));
                result.Columns.Add("despedida", Type.GetType("System.String"));
                result.Columns.Add("nombreVendedor", Type.GetType("System.String"));
                result.Columns.Add("nombreCargo", Type.GetType("System.String"));

                DataRow dr;

                foreach (var c in query)
                {
                    dr = result.NewRow();

                    dr[0] = c.idCartaCompromiso;
                    dr[1] = c.idVendedor;
                    dr[2] = c.idCargo;
                    dr[3] = c.numeroCarta.Trim() ?? string.Empty;
                    dr[4] = c.fechaCartaCompromiso.HasValue ? c.fechaCartaCompromiso.Value.ToLongDateString() : string.Empty;
                    dr[5] = c.nombrecliente.Trim() ?? string.Empty;
                    dr[6] = c.referencia1.Trim() ?? string.Empty;
                    dr[7] = c.referencia2.Trim() ?? string.Empty;
                    dr[8] = c.despedida.Trim() ?? string.Empty;
                    dr[9] = c.nombreVendedor.Trim() ?? string.Empty;
                    dr[10] = c.nombreCargo.Trim() ?? string.Empty;

                    result.Rows.Add(dr);
                }

                return result;
            }
        }
    }
}
